/****************************************
 * 2018 - 2021 版权所有 CopyRight(c) 快程乐码信息科技有限公司所有, 未经授权，不得复制、转发
 */

package com.kclm.security.demo.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/******************
 * @Author yejf
 * @Version v1.0
 * @Create 2020-07-20 11:02
 * @Description TODO
 */
@Controller
@Slf4j
public class IndexController {

    @RequestMapping(value = {"/","/login"}, method = RequestMethod.GET)
    public String index() {
        log.debug("--- 进入 index方法，返回登录页面");
        return "login"; //真正的路径是： templates/login.html
    }

    @RequestMapping("/home")
    public String homePage(ModelMap map) {
        log.debug("-- 进入 homePage方法，根据SpringSecurity的上下文来获取用户名和角色信息，并添加到map中，以便在前台页面调用");
        //
        map.put("user", getUserName());
        map.put("role", getAuthority());
        //返回
        return "home";
    }

    @RequestMapping("/admin")
    public String admin(ModelMap map) {
        log.debug("-- 进入 admin方法，。。。。");
        //
        map.put("user", getUserName());
        map.put("role", getAuthority());
        //
        return "admin";
    }

    @RequestMapping("/dba")
    public String dba(ModelMap map) {
        //
        log.debug("-- 进入 dba 方法， 。。。。。");
        //
        map.put("user", getUserName());
        map.put("role", getAuthority());
        //
        return "dba";
    }

    @RequestMapping("/accessDenied")
    public String accessDenied(ModelMap map) {
        //
        log.debug("-- 进入 accessDenied 方法，。。。。");
        //
        map.put("user", getUserName());
        map.put("role", getAuthority());
        //
        return "accessDenied";
    }

    /*************
     * 获取当前登录的用户名
     * @return
     */
    private String getUserName() {
        //
        log.debug("在控制器中获取当前登录的用户名");
        final String username = SecurityContextHolder.getContext().getAuthentication().getName();
        log.debug("当前登录的用户名是："+username);
        //
        return username;
    }

    /****************
     * 获取当前登录用户的角色名
     * @return
     */
    public String getAuthority() {
        log.debug("在控制器中获取当前登录用户的角色信息,以 [roleName, roleName] 拼接而成的字符串返回");
        final Collection<? extends GrantedAuthority> authorities =
                SecurityContextHolder.getContext().getAuthentication().getAuthorities();
        //创建一个集合来存放角色信息
        List<String> roles = new ArrayList<>();
        //
        for(GrantedAuthority ga : authorities) {
            roles.add(ga.getAuthority());
        }
        //
        log.debug("当前用户拥有的角色是："+roles.toString());
        //返回
        return roles.toString();
    }
}
